home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windows Expert
/
Windows Expert.iso
/
windownt
/
cxxp4w.zip
/
CHAP03
/
WINDOW.CPP
next >
Wrap
C/C++ Source or Header
|
1993-03-11
|
8KB
|
278 lines
#include "window.hpp"
ATOM aProp, aPropHigh;
#if defined( PTR16) || defined (WIN32)
#define PUTPWIN(hWnd,this) \
SetProp(hWnd,(LPSTR)MAKELONG(aProp,0),(HANDLE)this)
#define GETPWIN(hWnd) \
(Window *)GetProp(hWnd,(LPSTR)MAKELONG(aProp,0))
#define DELPWIN(hWnd) \
(Window *)RemoveProp(hWnd,(LPSTR)MAKELONG(aProp,0))
#else
#define PUTPWIN(hWnd,this)\
SetProp(hWnd,(LPSTR)MAKELONG(aProp,0),(HANDLE)this);\
SetProp(hWnd,(LPSTR)MAKELONG(aPropHigh,0),\
(HANDLE)((DWORD)this >>16))
#define GETPWIN(hWnd) (Window *)\
((DWORD)GetProp(hWnd,(LPSTR)MAKELONG(aProp,0))|\
((DWORD)GetProp(hWnd,(LPSTR)MAKELONG(aPropHigh,0)) <<16))
#define DELPWIN(hWnd) (Window *)\
((DWORD)RemoveProp(hWnd,(LPSTR)MAKELONG(aProp,0))|\
((DWORD)RemoveProp(hWnd,(LPSTR)MAKELONG(aPropHigh,0)) <<16))
#endif // PTR16
// Routines to associate instance pointers with windows
void PutWin(HWND hWnd, Window * pWin) { PUTPWIN(hWnd,pWin);};
Window * GetWin(HWND hWnd) {return GETPWIN(hWnd);};
Window* DelWin(HWND hWnd) {return DELPWIN(hWnd);};
//#ifdef WIN32
// WNDPROC Window::Handler;
//#else
FARPROC Window::Handler; // proc instance for CPPWinProc
//#endif
HANDLE Window::hAccel; // Current accelerator table
// Set window message proc to CPPWinProc
void Window::SetHandler()
{
//#ifdef WIN32
// DefaultHandler = (WNDPROC) GetWindowLong(hWnd,GWL_WNDPROC);
//#else
DefaultHandler = (FARPROC) GetWindowLong(hWnd,GWL_WNDPROC);
//#endif
SetWindowLong(hWnd,GWL_WNDPROC,(LONG) Handler);
PUTPWIN(hWnd,(HANDLE) this);
}
// Create a window
void Window::Create(LPSTR caption, LONG style, int x, int y,
int width, int height, HWND hPwnd, HMENU hMenu)
{
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = (WNDPROC) DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = 0;
hWnd = CreateWindow(Register(wc),
caption,style,x,y,width,height,
hPwnd,hMenu,hInst,NULL);
if (!hWnd) Error(IDS_APPLERROR, (LPSTR)"Window Creation");
SetHandler();
}
Window::Window() {
hWnd=0;
if (!Handler) {
#ifdef WIN32
Handler = (FARPROC)CPPWinProc;
#else
Handler = MakeProcInstance((FARPROC)CPPWinProc, hInst);
#endif
aProp=AddAtom("pWindow");
aPropHigh=AddAtom("pWindowHigh");
}
}
LPSTR Window::Register(WNDCLASS& wc) {
Error(IDS_APPLERROR,(LPSTR)"No Register method");
return NULL;
}
Window::~Window()
{
if (hWnd) {
Show(SW_HIDE);
//Destroy instances associated with child windows
HWND hCwnd= GetWindow (hWnd, GW_CHILD);
while ( hCwnd ){
Window * pWin=(Window*) GETPWIN(hCwnd);
do {
hCwnd=GetWindow(hCwnd,GW_HWNDNEXT);
} while (hCwnd && GetParent(hCwnd)!=hWnd);
if (pWin) delete pWin;
}
if (DELPWIN(hWnd) && DefaultHandler)
SetWindowLong(hWnd,GWL_WNDPROC,(LONG) DefaultHandler);
//if this is the top level window quit the application
if (!GetParent(hWnd)) PostQuitMessage(0);
DestroyWindow(hWnd);
hWnd=0;
}
}
// The application message loop
int Window::MessageLoop()
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
if (!hAccel ||
!TranslateAccelerator (hWnd, hAccel, &msg)){
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
return msg.wParam;
}
// The window message function, translates messages
// to calls to virtual functions
LONG Window::MessageProc( HWND hWnd, UINT msg, Event& evt)
{
POINT Pt;
switch (msg){
case WM_QUERYENDSESSION:
// OK to end Windows session?
return QueryClose();
case WM_CLOSE:
// if OK delete this instance
if (QueryClose ()) delete this;
return TRUE;
case WM_DESTROY:
if (DELPWIN(hWnd) && DefaultHandler)
SetWindowLong(hWnd,GWL_WNDPROC,(LONG) DefaultHandler);
Window::hWnd=0;
delete this;
break;
case WM_INITMENU:
return InitMenu((HMENU)evt.wParam);
case WM_SIZE:
return Size(LOWORD(evt.lParam),
HIWORD(evt.lParam),evt.wParam);
case WM_PAINT:
return Paint();
case WM_SETFOCUS:
return SetFocus((HWND)evt.wParam);
case WM_KILLFOCUS:
return KillFocus((HWND)evt.wParam);
case WM_CHAR:
return Char(evt.wParam, LOWORD(evt.lParam));
case WM_KEYDOWN:
if (KeyDown(evt.wParam,
*(KEYCODES*)&evt.lParam)) return TRUE;
return FALSE;
case WM_LBUTTONDOWN:
Pt.x=LOWORD(evt.lParam); Pt.y=HIWORD(evt.lParam);
return LButtonDown(Pt, evt.wParam);
case WM_LBUTTONUP:
Pt.x=LOWORD(evt.lParam); Pt.y=HIWORD(evt.lParam);
return LButtonUp(Pt, evt.wParam);
case WM_LBUTTONDBLCLK:
Pt.x=LOWORD(evt.lParam); Pt.y=HIWORD(evt.lParam);
return LButtonDblClk(Pt, evt.wParam);
case WM_RBUTTONDOWN:
Pt.x=LOWORD(evt.lParam); Pt.y=HIWORD(evt.lParam);
return RButtonDown(Pt, evt.wParam);
case WM_RBUTTONUP:
Pt.x=LOWORD(evt.lParam); Pt.y=HIWORD(evt.lParam);
return RButtonUp(Pt, evt.wParam);
case WM_MOUSEMOVE:
Pt.x=LOWORD(evt.lParam); Pt.y=HIWORD(evt.lParam);
return MouseMove(Pt, evt.wParam);
case WM_MOUSEACTIVATE:
MouseActivate((HWND)evt.wParam, LOWORD(evt.lParam));
if(DefaultHandler)
return CallWindowProc (DefaultHandler,
hWnd, msg, evt.wParam, evt.lParam);
else return FALSE;
case WM_COMMAND:
{
WORD wNotifyCode; // notification code
WORD wID; // item, control, or accelerator ID
HWND hWndCtl; // handle of control
#ifdef WIN32
wNotifyCode = HIWORD(evt.wParam);
wID = LOWORD(evt.wParam);
hWndCtl = (HWND) evt.lParam;
#else
wID = (int) evt.wParam;
hWndCtl = (HWND) LOWORD(evt.lParam);
wNotifyCode = HIWORD(evt.lParam);
#endif
return Command(wID,wNotifyCode, hWndCtl);
}
default:
if (DefaultHandler)
return CallWindowProc (DefaultHandler,
hWnd, msg, evt.wParam, evt.lParam);
} // switch
return FALSE;
} // MessageProc
BOOL Window::Size(UINT Width, UINT Height, UINT Type) {
if (!DefaultHandler) return FALSE;
return CallWindowProc (DefaultHandler,
hWnd, WM_SIZE, Type, MAKELONG(Width, Height));
}
BOOL Window::Paint() {
if (!DefaultHandler) return FALSE;
return CallWindowProc (DefaultHandler, hWnd, WM_PAINT, 0,0);
}
BOOL Window::Command( UINT Id, UINT Code, HWND hControl) {
if (!DefaultHandler) return FALSE;
#ifdef WIN32
return CallWindowProc (DefaultHandler,
hWnd, WM_COMMAND, MAKELONG(Id, Code), (DWORD)hControl);
#else
return CallWindowProc (DefaultHandler,
hWnd, WM_COMMAND, Id, MAKELONG(hControl, Code));
#endif
}
LONG CALLBACK CPPWinProc(HWND hWnd, UINT Message,
UINT wParam,LONG lParam)
{
Window* pWin = GETPWIN(hWnd);
Event evt(wParam,lParam);
if (pWin) {
// There is a C++ instance for the window
return pWin->MessageProc(hWnd,Message,evt);
}
else return FALSE;
} // CPPWinProc
void Window::Move(RECT * rc, BOOL repaint) {
MoveWindow (hWnd,
rc->left,
rc->top,
rc->right-rc->left,
rc->bottom-rc->top,
repaint);
}